<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03_作用域链</title>
</head>
<body>
<!--
1. 理解
  * 多个上下级关系的作用域形成的链式关系, 它的方向是从下向上的(从内到外)
  * 作用链是一个数组结构的数据，保存着当前作用域的变量对象及其上级作用域的变量对象，直到全局的变量对象
  * 查找变量时就是沿着作用域链来查找的
2. 作用域链如何产生
  * 函数在定义的时候自动添加一个属性 ‘[[Scopes]]’, 该属性保存的是其上级作用域链
  * 当函数执行的时候，进入执行上下文环境，将创建的变量对象添加到‘[[Scopes]]’数组的第一个位置，形成新的数组，该数组就是当前函数拥有的作用域链
2. 查找一个变量的查找规则
  * 先在当前作用域的变量对象中查找，如果有就使用
  * 如果没有就会沿着作用域链的数组去上级作用域中的变量对象中查找
  * 找到就返回对应的值，如果没有继续向上查找，直到找到最后一个变量对象(全局的变量对象)，如果还没有就会报错
-->
<script type="text/javascript">

  var a = 2;
  function fn1() {
    var b = 3;
    function fn2() {
      var c = 4;
      console.log(c);
      console.log(b);
      console.log(a);
      console.log(d);
    }

    fn2();
  }
  fn1();

</script>

</body>
</html>